/*
 Funciona Perfectamente
 */
package funcionesDeSeleccion;

import elementosEvolutivos.Cromosoma;
import elementosEvolutivos.FuncSeleccion;
import java.util.ArrayList;
import java.util.Collection;
import util.Aleatorio;

public class TorneoProbabilista implements FuncSeleccion{
    
	private int numContrincantes;
	private double probabilidad;
	
    public TorneoProbabilista(int nc, double p){
		numContrincantes = nc;
		probabilidad = p;
		
	}
    
    public Collection<Cromosoma> seleccionar(Collection<Cromosoma> poblacion, int tam_sel) {
		Collection<Cromosoma> nuevaPoblacion = new ArrayList<Cromosoma>();
		double mejor_apt;
		double peor_apt;
		Cromosoma cr_ganador=null;
		Cromosoma cr_perdedor=null;
		int pos_contr;
		int num_elem = poblacion.size();
		for(int i=0; i<tam_sel; i++){
			mejor_apt = -1.0;
			peor_apt = Double.MAX_VALUE;
			
			for(int j=0; j<numContrincantes; j++){
				pos_contr = (int) (Aleatorio.getDoubleAleatorio()*num_elem);
				Cromosoma cr = ((ArrayList<Cromosoma>)poblacion).get(pos_contr);
				double apt = cr.getAptitud();
				if(mejor_apt<=apt){
					mejor_apt=apt;
					cr_ganador=cr;
				}
				if(peor_apt>=apt){
					peor_apt=apt;
					cr_perdedor=cr;
				}
			}
			
			if(probabilidad < Aleatorio.getDoubleAleatorio())
				nuevaPoblacion.add(cr_ganador.clone());
			else
				nuevaPoblacion.add(cr_perdedor.clone());
		}
		return nuevaPoblacion;
	}
}
